In current Layer 2 (L2) and Layer 3 (L3) networks, path selection for flows is typically based on some variant of a cost-based “shortest path” algorithm. One problem with relying solely on this approach for path selection is that certain links common to the shortest paths of several flows may become congested, while other available paths/links in the network topology may remain underutilized. This problem is visualized in network 100 of FIG. 1, which depicts a server 102 in communication with clients 104-110 via switches 112-122. In this example, the shortest paths between server 102 and clients 104, 106, and 108 respectively all include the link between switches 112 and 114 (i.e., link 124), and thus the flows between server 102 and clients 104, 106, and 108 (i.e., flows 126, 128, and 130) all traverse link 124. This, in turn, means that link 124 may become over-utilized and potentially bottleneck flows 126, 128, and 130, even though there are other, less utilized paths in network 100 that server 102 can use to communicate with clients 104, 106, and 108.
The congestion problem described above can be mitigated to an extent by reserving link bandwidth on a per-flow basis using a resource reservation protocol, such as MPLS-based RSVP-TE. However, such protocols generally require hop-by-hop bandwidth admission control and path setup signaling, which add to the overall deployment and operational complexity of the network. In addition, due to their distributed nature, resource reservation protocols are not designed to address the issue of network-wide bandwidth fragmentation (i.e., the division of available network bandwidth into small, isolated fragments). When this type of fragmentation occurs, the network may be unable to admit future, large bandwidth flows, even if the network has sufficient available bandwidth at the aggregate level.